using System;
using System.IO;					// Zur Arbeit mit Datei
using System.Collections.Generic;	// Grundlegende Datenstrukturen

namespace Graph
{
	public class DirectGraph : UndirectGraph
	{
        Dictionary<int, Dictionary<int, List<Kante>>> eOut = new Dictionary<int, Dictionary<int, List<Kante>>>();

        public DirectGraph()
            : base()
        {
            v = new Dictionary<int, DijkstraKnoten>();
            e = new Dictionary<int, Dictionary<int, List<Kante>>>();
        }

        public override void neueKante(int von, int nach, double gewicht)
        {
            if (von == nach)
                throw new Exception(String.Format("Es sollte eine Schlinge von {0} nach {1} eingefügt werden! Graph unterstützt dies nicht!", von, nach));
            Kante Edge = new Kante(von,nach,gewicht);
            if (eOut[von].ContainsKey(nach))
                eOut[von][nach].Add(Edge);
            else
                eOut[von].Add(nach, new List<Kante> { Edge });

            if (e[nach].ContainsKey(von))
                e[nach][von].Add(Edge);
            else
                e[nach].Add(von, new List<Kante> {Edge});
        }
        public override void neueKante(Kante kante, double gewicht)
        {
            if (kante.Von == kante.Nach)
                throw new Exception(String.Format("Es sollte eine Schlinge von {0} nach {1} eingefügt werden! Graph unterstützt dies nicht!", kante.Von, kante.Nach));
            if (eOut[kante.Von].ContainsKey(kante.Nach))
                eOut[kante.Von][kante.Nach].Add(kante);
            else
                eOut[kante.Von].Add(kante.Nach, new List<Kante> { kante });

            if (e[kante.Nach].ContainsKey(kante.Von))
                e[kante.Nach][kante.Von].Add(kante);
            else
                e[kante.Nach].Add(kante.Von, new List<Kante> { kante });
        }

        public Dictionary<int, Dictionary<int, List<Kante>>> EOut { get { return e; } }
        public Dictionary<int, Dictionary<int, List<Kante>>> EIn { get { return eOut; } }
	}
}
